
/**
 * 原型关系的处理， 主要的是function中的， __proto__和prototype的区别.
 */

const ckFunc = function () {}
const ck = new ckFunc()

// 直接使用ck.show()会报错的， 因为自己没有， 父亲辈的也没有。
ckFunc.prototype.show= () => {
    console.log('ckFunc show method ')
}
// 这里就会直接调用， 父亲上面的show方法
ck.show()


// 直接通过构造方法写的方法， 是有prototype和__proto__两个爸爸的。

function User (){

}

User.__proto__.render = () => {
    console.log('user __proto__ render method')
}
User.prototype.render = () => {
    console.log('user prototype render method')
}

User.render = () => {
    console.log('user render method')
}

console.dir(User)// 这里User上面的prototype和__proto__中是不一样的

const user = new User()
// true 方法的prototype和方法的构造对象新建的对象的爸爸是一样的。
console.log(user.__proto__ === User.prototype);
// console.dir(User);

// prototype 相当于自己， 就是获取本身的对象属性
console.log(User.prototype.__proto__ === Object.prototype)


// 基本数据类型就是放在内存的栈里面的， 没有涉及到堆的知识。
let a = null;
console.dir(a)
let b = undefined;
console.dir(b)
let c = false
console.dir(c)
let d = 1
console.dir(d)
let f = 'str'
console.dir(f)

// 引用数据类型， 就有__proto__属性， 基本属性类型， 就是存一个数据在堆里面， 栈里面存的是指针。
let g = []
console.dir(g) // 数组只有__proto__
let h = function () {}
console.dir(h) // 方法既有__proto__, 又有prototype
let i = {}
console.dir(i)// 对象只有__proto__


//看看这些引用对象类型的__proto__指向的是谁, array的上两级才是object, 因为array的上一级是Array， Array的上一级才是Object
console.log('arr',g.__proto__ === Array.prototype)// 这里返回的是true
console.log(g.__proto__.__proto__=== Object.prototype) // 这里返回的是true


// function 的__proto__指向的是谁
console.log(h.__proto__.__proto__ === Object.prototype)
// console.log(h.__proto__ === Object) // false

// {}对象的__proto__指向的是谁, 对象的上一级就是对象本省了
console.log(i.__proto__ === Object.prototype)


// {} 对象的父亲， 就是Object的prototype原型
console.dir({}.__proto__ === Object.prototype)
// 这个打印的是{}的父亲
console.log({}.__proto__)

// 这里是undefined， 未定义
Object.prototype.render = () =>{
    console.log('render')
}
console.log(Object.prototype)

const arr = []
console.log(arr instanceof Object)
// 这样就是true, 基本数据类型
console.log(typeof null === 'object');
// 这样就是false， 引用数据类型
console.log(null instanceof Object)



